package controller

import (
	"html/template"
	"net/http"
	"strconv"
	"web08_35_tushu/dao"
	"web08_35_tushu/model"
)

//GetBooks 获取所有图书
func GetBooks(w http.ResponseWriter, r *http.Request) {
	//调用函数获取所有图书
	books, _ := dao.GetBooks()
	//解析模板文件
	t := template.Must(template.ParseFiles("pages/manager/book_manager.html"))
	//把数据传过去
	t.Execute(w, books)
}

//AddBook 添加图书
func AddBook(w http.ResponseWriter, r *http.Request) {
	//获取图书信息
	title := r.PostFormValue("title")
	author := r.PostFormValue("author")
	price := r.PostFormValue("price")
	sales := r.PostFormValue("sales")
	stock := r.PostFormValue("stock")
	if title == "" {
		GetPageBooks(w, r)
		return
	}
	//将字符串转换为浮点型和int型
	fPrice, _ := strconv.ParseFloat(price, 64)
	fSales, _ := strconv.ParseInt(sales, 10, 0)
	//第一个参数是转换的字符串，第二个是进制，第三个是int的类型，0是int64,填8就是int8,16就是int16
	fStock, _ := strconv.ParseInt(stock, 10, 0)
	book := &model.Book{
		Title:   title,
		Author:  author,
		Price:   fPrice,
		Sales:   int(fSales), //强转int64为int型
		Stock:   int(fStock),
		ImgPath: "/static/img/default.jpg",
	}
	//调用函数添加图书
	dao.AddBook(book)
	//添加完图书后再查询一遍
	GetPageBooks(w, r)
}

//DeleteBook 根据图书id删除图书
func DeleteBook(w http.ResponseWriter, r *http.Request) {
	//获取要删除图书的id
	bookID := r.FormValue("bookId")
	//调用函数删除图书信息
	dao.DeleteBook(bookID)
	//弄完后查询一遍
	GetPageBooks(w, r)
}

//ToUpdateBookPage 到达修改页面，根据图书id查询一本书的信息，因为要传递并显示参数，所以有这个函数
func ToUpdateBookPage(w http.ResponseWriter, r *http.Request) {
	//获取图书id
	bookID := r.FormValue("bookId")
	//调用数据库操作函数
	book, _ := dao.GetBookByID(bookID)
	// fmt.Println(book)
	t := template.Must(template.ParseFiles("pages/manager/book_modify.html"))
	t.Execute(w, book)
}

//UpdateBook 更新图书信息
func UpdateBook(w http.ResponseWriter, r *http.Request) {
	//获取图书信息
	bookID := r.PostFormValue("bookId")
	title := r.PostFormValue("title")
	author := r.PostFormValue("author")
	price := r.PostFormValue("price")
	sales := r.PostFormValue("sales")
	stock := r.PostFormValue("stock")
	if title == "" {
		GetPageBooks(w, r)
		return
	}
	//将字符串转换为浮点型和int型
	fPrice, _ := strconv.ParseFloat(price, 64)
	//第一个参数是转换的字符串，第二个是进制，第三个是int的类型，0是int64,填8就是int8,16就是int16
	fSales, _ := strconv.ParseInt(sales, 10, 0)
	fStock, _ := strconv.ParseInt(stock, 10, 0)
	fBookID, _ := strconv.ParseInt(bookID, 10, 0)
	book := &model.Book{
		ID:      int(fBookID),
		Title:   title,
		Author:  author,
		Price:   fPrice,
		Sales:   int(fSales), //强转int64为int型
		Stock:   int(fStock),
		ImgPath: "/static/img/default.jpg",
	}
	//调用函数更新图书
	dao.UpdateBook(book)
	//添加完图书后再查询一遍
	GetPageBooks(w, r)
}

//***************下面函数合并了添加和修改

//ToUpdateBookPage2 到达修改页面，根据图书id查询一本书的信息
func ToUpdateBookPage2(w http.ResponseWriter, r *http.Request) {
	//获取图书id
	bookID := r.FormValue("bookId")
	//调用数据库操作函数
	book, _ := dao.GetBookByID(bookID)
	if book.ID > 0 {
		t := template.Must(template.ParseFiles("pages/manager/book_edit.html"))
		t.Execute(w, book)
	} else {
		t := template.Must(template.ParseFiles("pages/manager/book_edit.html"))
		t.Execute(w, "")
	}

	// fmt.Println(book)

}

//UpdateOrAddBook 更新或添加图书信息
func UpdateOrAddBook(w http.ResponseWriter, r *http.Request) {
	//获取图书信息
	bookID := r.PostFormValue("bookId")
	title := r.PostFormValue("title")
	author := r.PostFormValue("author")
	price := r.PostFormValue("price")
	sales := r.PostFormValue("sales")
	stock := r.PostFormValue("stock")
	if title == "" {
		GetPageBooks(w, r)
		return
	}
	//将字符串转换为浮点型和int型
	fPrice, _ := strconv.ParseFloat(price, 64)
	//第一个参数是转换的字符串，第二个是进制，第三个是int的类型，0是int64,填8就是int8,16就是int16
	fSales, _ := strconv.ParseInt(sales, 10, 0)
	fStock, _ := strconv.ParseInt(stock, 10, 0)
	fBookID, _ := strconv.ParseInt(bookID, 10, 0)
	book := &model.Book{
		ID:      int(fBookID),
		Title:   title,
		Author:  author,
		Price:   fPrice,
		Sales:   int(fSales), //强转int64为int型
		Stock:   int(fStock),
		ImgPath: "/static/img/default.jpg",
	}
	//判断是否存在bookid,存在就是更新，不存在就是添加
	if book.ID > 0 {
		//大于0是更新
		//调用函数更新图书
		dao.UpdateBook(book)
	} else {
		//是添加
		dao.AddBook(book)
	}
	//调用函数更新图书
	dao.UpdateBook(book)
	//添加完图书后再查询一遍
	GetPageBooks(w, r)
}

//************下面是获取带分页的页面************

//GetPageBooks 用来处理图书管理页，代替了GetBooks处理器，大致结构和GetBooks一致，只是传的是page结构体
func GetPageBooks(w http.ResponseWriter, r *http.Request) {
	//获取页码
	pageNo := r.FormValue("pageNo")
	if pageNo == "" {
		pageNo = "1"
	}
	//调用dao.GetPageBooks函数获取page结构体
	page, _ := dao.GetPageBooks(pageNo)
	//解析模板,解析的还是那个模板，只是把模板那边range .改成了range .Books
	t := template.Must(template.ParseFiles("pages/manager/book_manager.html"))
	//把结构体传过去
	t.Execute(w, page)
}

//IndexHandler 旧的首页，套用了GetPageBooks
func IndexHandler(w http.ResponseWriter, r *http.Request) {
	//获取页码
	pageNo := r.FormValue("pageNo")
	if pageNo == "" {
		pageNo = "1"
	}
	//调用dao.GetPageBooks函数获取page结构体
	page, _ := dao.GetPageBooks(pageNo)
	//解析模板,解析的还是那个模板，只是把模板那边range .改成了range .Books
	t := template.Must(template.ParseFiles("index.html"))
	//把结构体传过去
	t.Execute(w, page)

}

//GetPageBooksByPrice 新首页处理，代替了IndexHandler处理器，大致结构和GetBooks一致，只是传的是page结构体
func GetPageBooksByPrice(w http.ResponseWriter, r *http.Request) {
	//获取页码
	pageNo := r.FormValue("pageNo")
	if pageNo == "" {
		pageNo = "1"
	}
	//获取价格范围
	minPrice := r.FormValue("min")
	maxPrice := r.FormValue("max")
	var page *model.Page
	if minPrice == "" && maxPrice == "" {
		//不存在价格范围，调用dao.GetPageBooks函数获取page结构体
		page, _ = dao.GetPageBooks(pageNo)
	} else {
		//存在价格范围，调用dao.GetPageBooksByPrice函数获取page结构体
		page, _ = dao.GetPageBooksByPrice(pageNo, minPrice, maxPrice)
		//存在价格，上面GetPageBooksByPrice把书籍查询出来，下面把价格信息重新赋值给page并一起返回给页面
		page.MinPrice = minPrice
		page.MaxPrice = maxPrice
	}

	//通过函数IsLogin判断是否登录,避免出现sql注入之类的
	// 替代了原本的获取cookie判断是否已登录
	// cookie, _ := r.Cookie("user")
	flag, session := dao.IsLogin(r)

	// cookieValue := cookie.Value
	// session, _ := dao.GetSession(cookieValue)
	// if session.UserID > 0 {
	if flag {
		page.IsLogin = true
		page.Username = session.UserName
	}

	//解析模板,解析的还是那个模板，只是把模板那边range .改成了range .Books
	t := template.Must(template.ParseFiles("index.html"))
	//把结构体传过去
	t.Execute(w, page)
}
